package br.com.Bolao.application.controller.usuarios;

import br.com.Bolao.application.controller.*;
import br.com.Bolao.application.dao.usuarios.UsuarioDAO;
import br.com.Bolao.application.util.CriptografiaSHA;
import br.com.Bolao.application.util.mail.EmailUtils;
import br.com.Bolao.model.Usuario;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import org.apache.commons.lang.StringUtils;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

/**
 *
 * @author frederico.cruz
 */
@Scope(ScopeType.CONVERSATION)
@Name("usuarioAction")
public class UsuarioController extends BaseController {

    @In
    private UsuarioDAO usuarioDAO;
    @In
    private UsuarioService usuarioService;
    @In
    private AuthenticationController authenticator;
    private DataModel listaUsuarios;
    private String paramNome;
    private String paramLogin;
    private String paramSenha;
    private String paramSenhaConfirmacao;
    private String paramAcesso;
    private String paramEmail;
    private String paramConta;
    private String paramAgencia;
    private String paramBanco;
    private String paramSenhaNova;
    private String valorTotalBolao;
    private Usuario usuario;
    private boolean usuarioExiste = false;
    private boolean procurandoUsuario = false;
    private boolean usuarioNaoExiste = false;

    public String setupTotalBolao() {
        int numeroUsuarios = usuarioDAO.obterNumeroUsuarios();
        double total = numeroUsuarios *20;
        double parteAdmin = total*20;
        parteAdmin = parteAdmin / 100;
        total = total-parteAdmin;
        Double imprimeTotal = new Double(total);
        valorTotalBolao = imprimeTotal.toString();
        return "valor_total";
    }

    public String setup() {
        paramSenhaNova = "";
        paramSenha = "";
        return "altera_usuario";
    }

    public String setupLiberarUsuario() {
        return "liberar_usuario";
    }

    /**
     * Alteração de senha do usuário
     * @param login
     */
    public void alterarUsuario(String login) {
        try {
            usuario = usuarioDAO.obterPorUsuario(login);
            usuario.setSenha(CriptografiaSHA.criptografar(paramSenhaNova));
            usuarioDAO.atualizar(usuario);
            adicionarMensagemInformacao("Senha alterada com sucesso!");
        } catch (Exception e) {
            adicionarMensagemErro("Não foi possível alterar senha! Entre em contato com mbsolutions@gmail.com");
        }
    }

    /**
     * Cadastro de usuário.
     */
    public void cadastrarUsuario(Boolean usuarioEstaLogado) {
        if (!paramSenha.equals(paramSenhaConfirmacao)) {
            adicionarMensagemErro("As senhas não conferem");
            return;
        }
        try {
            Usuario usuarioEscopo = new Usuario();

            if (StringUtils.isEmpty(paramAcesso)) {
                usuarioEscopo.setAcesso(0);
            } else {
                usuarioEscopo.setAcesso(Integer.parseInt(paramAcesso));
            }

            usuarioEscopo.setLogin(paramLogin);

            //Criptografa senha
            paramSenha = CriptografiaSHA.criptografar(paramSenha);
            usuarioEscopo.setSenha(paramSenha);
            usuarioEscopo.setNome(paramNome);
            usuarioEscopo.setBanco(paramBanco);
            usuarioEscopo.setContaBanco(paramConta);
            usuarioEscopo.setAgencia(paramAgencia);
            usuarioEscopo.setEmail(paramEmail);
            usuarioEscopo.setPontuacao(0);
            usuarioEscopo.setPagamento(false);
            usuarioDAO.salvar(usuarioEscopo);

            EmailUtils emailUtils = new EmailUtils();
            emailUtils.enviaEmailConfirmacao(usuarioEscopo);
            emailUtils.enviaEmailMantenedor(usuarioEscopo.getNome());
            adicionarMensagemInformacao("Verifique seu e-mail para confirmar o cadastrado");

            //Limpar tela
            paramNome = "";
            paramSenha = "";
            paramAcesso = "";
            paramEmail = "";
            paramConta = "";
            paramAgencia = "";
            paramBanco = "";

        } catch (Exception e) {
            adicionarMensagemErro("Não foi possível adicionar usuário! " + e.getMessage() + ".  |  Entre em contato com mbsolutions.bh@gmail.com");
        }

        try {
            usuarioService.sincronizaUsuarioJogos(usuarioDAO.obterPorUsuario(paramLogin));
        } catch (Exception e) {
            adicionarMensagemErro("Erro ao sincronizar jogos para o usuario! " + e.getMessage());
        }
        paramLogin = "";
    }

    /**
     * Método que verifica se o login escolhido pelo usuário está disponível
     * para cadastro e mostra na tela se o mesmo está ou não disponível.
     */
    public void verificaLogin() {
        String loginInputText = (String) FacesContext.getCurrentInstance().getViewRoot().findComponent("fpUsuarios:itLogin").getAttributes().get("submittedValue");
        if (StringUtils.isEmpty(loginInputText)) {
            procurandoUsuario = true;
            usuarioNaoExiste = false;
            usuarioExiste = false;
        } else if (usuarioDAO.obterPorUsuario(loginInputText) != null) {
            usuarioExiste = true;
            usuarioNaoExiste = false;
            procurandoUsuario = false;
        } else {
            usuarioNaoExiste = true;
            usuarioExiste = false;
            procurandoUsuario = false;
        }
    }

    public boolean verificaPagamento(String loginIn) {
        if (StringUtils.isEmpty(loginIn)) {
            return false;
        } else {
            Usuario usuarioLoginIn = usuarioDAO.obterPorUsuario(loginIn);
            return usuarioLoginIn.isPagamento();
        }
    }

    public void liberaUsuario(Usuario usuario) {
        usuario.setPagamento(true);
        usuarioDAO.salvar(usuario);
        adicionarMensagemInformacao("Usuário liberado para apostas!");
    }

    public void bloquearUsuario(Usuario usuario) {
        usuario.setPagamento(false);
        usuarioDAO.salvar(usuario);
        adicionarMensagemInformacao("Usuário bloqueado para apostas!");
    }

    /*
     * GETS and SETS
     */
    public DataModel getListaUsuarios() {
        return listaUsuarios = new ListDataModel(usuarioDAO.obterTodosOrdenadoPontos());
    }

    public void setListaUsuarios(DataModel listaUsuarios) {
        this.listaUsuarios = listaUsuarios;
    }

    public String getValorTotalBolao() {
        return valorTotalBolao;
    }

    public void setValorTotalBolao(String valorTotalBolao) {
        this.valorTotalBolao = valorTotalBolao;
    }

    public String getParamSenhaConfirmacao() {
        return paramSenhaConfirmacao;
    }

    public void setParamSenhaConfirmacao(String paramSenhaConfirmacao) {
        this.paramSenhaConfirmacao = paramSenhaConfirmacao;
    }

    public String getParamLogin() {
        return paramLogin;
    }

    public void setParamLogin(String paramLogin) {
        this.paramLogin = paramLogin;
    }

    public boolean isUsuarioNaoExiste() {
        return usuarioNaoExiste;
    }

    public void setUsuarioNaoExiste(boolean usuarioNaoExiste) {
        this.usuarioNaoExiste = usuarioNaoExiste;
    }

    public String getParamSenhaNova() {
        return paramSenhaNova;
    }

    public void setParamSenhaNova(String paramSenhaNova) {
        this.paramSenhaNova = paramSenhaNova;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public String getParamAcesso() {
        return paramAcesso;
    }

    public void setParamAcesso(String paramAcesso) {
        this.paramAcesso = paramAcesso;
    }

    public String getParamEmail() {
        return paramEmail;
    }

    public String getParamBanco() {
        return paramBanco;
    }

    public void setParamBanco(String paramBanco) {
        this.paramBanco = paramBanco;
    }

    public String getParamAgencia() {
        return paramAgencia;
    }

    public void setParamAgencia(String paramAgencia) {
        this.paramAgencia = paramAgencia;
    }

    public boolean isProcurandoUsuario() {
        return procurandoUsuario;
    }

    public void setProcurandoUsuario(boolean procurandoUsuario) {
        this.procurandoUsuario = procurandoUsuario;
    }

    public boolean isUsuarioExiste() {
        return usuarioExiste;
    }

    public void setUsuarioExiste(boolean usuarioExiste) {
        this.usuarioExiste = usuarioExiste;
    }

    public void setParamEmail(String paramEmail) {
        this.paramEmail = paramEmail;
    }

    public String getParamNome() {
        return paramNome;
    }

    public void setParamNome(String paramNome) {
        this.paramNome = paramNome;
    }

    public String getParamSenha() {
        return paramSenha;
    }

    public void setParamSenha(String paramSenha) {
        this.paramSenha = paramSenha;
    }

    public String getParamConta() {
        return paramConta;
    }

    public void setParamConta(String paramConta) {
        this.paramConta = paramConta;
    }
}
